package com.node.line;

import java.util.ArrayList;
import java.util.List;

public class LNodes {
	public LNodes() {
		
	}
	
	public LNodes(LNode head, LNode last) {
		this.head = head;
		this.last = last;
		
	}

	LNode head; // 头节点,起始节点
	LNode last; // 最后一个节点
	
	/*
	 * 线性的节点，从头节点开始 一直串联n多节点。
	 * 第一个节点叫做头节点,最后一个节点叫做末尾节点
	 * [{节点1 下节点->},{节点2 下节点->},{节点3 下节点->},null]
	 */
	
	public LNodes add(Object value)
	{
		LNode node = new LNode();	// 创建节点
		node.value = value;			// 设置节点值
		/*
		 *  如果第一次调用此方法 头节点是一个null值,则此时只有唯一的一个节点
		 *  [{节点1 下节点->},null]
		 *  这个节点既是头也是尾,故算法为如下
		 */
		if(head == null){
			head = node;
			last = node;
		}else{
			// 当已经拥有节点时,添加新的节点是添加在当前last最后一个节点的后面，则这个新的节点变为last节点
			last.next = node;
			last = node;
		}
		return this;
	}
	
	
	// 获取所有节点的值
	public List<Object> getValues(){
		List<Object> values= new ArrayList<Object>();
		/*
		 * 设计思路：当head不存在时候，说明暂未调用add添加节点，只有当head存在时候可以取得节点当值
		 * 从head节点开始,获取value后通过节点中下一节点取得链表当下一节点，在获得值,直到下一节点为null则全部取完
		 */
		LNode getNext = head; // 如果节点为null 无法进入while循环
		while(getNext != null){
			values.add(getNext.value);
			getNext = getNext.next;
		}
		return values;
	}
	public static List<Object> getValues(LNode head){
		List<Object> values= new ArrayList<Object>();
		/*
		 * 设计思路：当head不存在时候，说明暂未调用add添加节点，只有当head存在时候可以取得节点当值
		 * 从head节点开始,获取value后通过节点中下一节点取得链表当下一节点，在获得值,直到下一节点为null则全部取完
		 */
		LNode getNext = head; // 如果节点为null 无法进入while循环
		while(getNext != null){
			values.add(getNext.value);
			getNext = getNext.next;
		}
		return values;
	}
	
	// 取得第一个节点值并且 移除第一节点
	public Object pop(){
		Object value = null;
		/*
		 * 设计思路，获取head节点当value 如果head节点为null时则暂未存入数据或已经取完
		 * 得到head数据后，将它从节点链表删除，则它的下一节点变为head节点。同时将本节点当引用删除。
		 */
		if(head!=null){
			LNode firstNode = head; // 获取第一节点
			value = firstNode.value;
			head = firstNode.next; // 将链表头部摘除,设置下一节点为head
			firstNode.next = null;// 清楚对象内当引用。使被摘除当节点已经独立
		}
		return value;
	}
	public LNode getHead() {
		return head;
	}
	public LNode getLast() {
		return last;
	}
	@Override
	public String toString() {
		
		return getValues().toString();
	}
	
}
